package com.yuxl.admin.manager.auth.core.service;

import com.yuxl.admin.manager.auth.core.entity.AuthMenu;
import com.yuxl.admin.manager.auth.core.entity.AuthRole;
import com.yuxl.admin.manager.auth.core.repository.AuthMenuRepository;
import com.yuxl.admin.manager.auth.core.repository.AuthRolePowerRepository;
import com.yuxl.admin.manager.auth.core.repository.AuthRoleRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.time.LocalDateTime;

@Service
@RequiredArgsConstructor
public class AuthMenuService {
    private final AuthMenuRepository authMenuRepository;
    private final AuthRolePowerRepository authRolePowerRepository;
    private final AuthRoleRepository authRoleRepository;
    /**
     * 创建新菜单
     * @param entity 要创建的菜单对象
     * @return 创建成功的菜单对象
     */
    public Mono<AuthMenu> create(AuthMenu entity) {
        // 保存新菜单到数据库
        entity.setCreateTime(LocalDateTime.now());
        return authMenuRepository.save(entity);
    }

    /**
     * 根据ID获取菜单
     * @param id 菜单ID
     * @return 菜单对象
     */
    public Mono<AuthMenu> getById(Long id) {
        return authMenuRepository.findById(id);
    }

    /**
     * 更新菜单信息
     * @param id 要更新的菜单ID
     * @param entity 包含更新信息的菜单对象
     * @return 更新后的菜单对象
     */
    public Mono<AuthMenu> update(Long id,AuthMenu entity) {
        return authMenuRepository.findById(id)
                // 根据ID查找现有菜单
                .flatMap(existingRole -> {
                    entity.setId(id);
                    entity.setUpdateTime(LocalDateTime.now());
                    // 更新菜单信息
                    return authMenuRepository.save(entity);
                    // 保存更新后的菜单
                });
    }

    /**
     * 删除菜单
     * @param id 要删除的菜单ID
     * @return 无返回值
     */
    public Mono<Void> delete(Long id) {
        return authMenuRepository.deleteById(id);
    }

    /**
     * 获取所有菜单
     * @return 所有菜单的列表
     */
    public Flux<AuthMenu> getAll() {
        return authMenuRepository.findAll();
    }

    /**
     * 获取菜单数量
     * @return 符合条件的菜单数量
     */
    public Mono<Long> count() {
        return authMenuRepository.count();
    }

    /**
     * 分页获取菜单
     * @param page 页码
     * @param size 每页大小
     * @return 分页后的菜单列表
     */
    public Flux<AuthMenu> getPage(int page,int size) {
        return authMenuRepository.findAll()
                // 获取所有菜单
                .skip((long) page * size)
                // 跳过前面的菜单
                .take(size)
                ;
    }

    /**
     * 获取菜单的角色
     * @param menuId 菜单ID
     * @return 拥有指定菜单的用户列表
     */
    public Flux<AuthRole> getRoles(Long menuId) {
        if (menuId != null) {
            return
                    authRolePowerRepository.findByMenuId(menuId)
                            // 根据菜单ID查找用户菜单关系
                            .flatMap(roleMenu -> authRoleRepository.findById(roleMenu.getRoleId()))
                    ;
            // 根据用户ID查找用户
        }else{
            return Flux.empty();
        }
    }
}
